/*!
    \file  link32fa016bx_gpio.h
    \brief definitions for the GPIO

    \version 2024-02-26, V1.0.0, firmware for LINK32FA016BX
*/


#ifndef LINK32FA016BX_GPIO_H
#define LINK32FA016BX_GPIO_H_GPIO_H

#include "link32fa016bx.h"

LINK32FA016BX_BEGIN_DECLS

/* GPIOx(x=A,B,C,D,E) definitions */
#define GPIO0                      (GPIO_BASE + 0x00000000U)
#define GPIO1                      (GPIO_BASE + 0x00010000U)
#define GPIO2                      (GPIO_BASE + 0x00020000U)
#define GPIO3                      (GPIO_BASE + 0x00030000U)

/* registers definitions */

/* GPIO registers definitions */
#define GPIO_DATA_IN(gpiox)            REG32((gpiox) + 0x00U)    /*!< GPIO Data In */
#define GPIO_DATA_OUT(gpiox)           REG32((gpiox) + 0x04U)    /*!< GPIO Data Out */
#define GPIO_PULL_UP(gpiox)            REG32((gpiox) + 0x08U)    /*!< GPIO Pull Up */
#define GPIO_PULL_DN(gpiox)            REG32((gpiox) + 0x0CU)    /*!< GPIO Pull Down */
#define GPIO_OE_SET(gpiox)             REG32((gpiox) + 0x10U)    /*!< GPIO Output Enable Set */
#define GPIO_OE_CLR(gpiox)             REG32((gpiox) + 0x14U)    /*!< GPIO Output Enable Clear */
#define GPIO_AF_SET(gpiox)             REG32((gpiox) + 0x18U)    /*!< GPIO Alternate Function Set*/
#define GPIO_AF_CLR(gpiox)             REG32((gpiox) + 0x1CU)    /*!< GPIO Alternate Function Clear*/
#define GPIO_INT_EN_SET(gpiox)         REG32((gpiox) + 0x20U)    /*!< GPIO Interrupt Enable Set */
#define GPIO_INT_EN_CLR(gpiox)         REG32((gpiox) + 0x24U)    /*!< GPIO Interrupt Enable Clear */
#define GPIO_INT_TYPE_SET(gpiox)       REG32((gpiox) + 0x28U)    /*!< GPIO Interrupt Type Set */
#define GPIO_INT_TYPE_CLR(gpiox)       REG32((gpiox) + 0x2CU)    /*!< GPIO Interrupt Type Clear */
#define GPIO_INT_POL_SET(gpiox)        REG32((gpiox) + 0x30U)    /*!< GPIO Interrupt Polarity Set */
#define GPIO_INT_POL_CLR(gpiox)        REG32((gpiox) + 0x34U)    /*!< GPIO Interrupt Polarity Clear */
#define GPIO_INT_STA(gpiox)            REG32((gpiox) + 0x38U)    /*!< GPIO Interrupt Status*/
#define GPIO_ANA_EN(gpiox)             REG32((gpiox) + 0x3CU)    /*!< GPIO Analog Enable*/
#define GPIO_AFMUX_0_7(gpiox)          REG32((gpiox) + 0x40U)    /*!< GPIO Alternate Function Mux 0-7*/
#define GPIO_AFMUX_8_15(gpiox)         REG32((gpiox) + 0x44U)    /*!< GPIO Alternate Function Mux 8-15*/

#define GPIO_PIN_0                     BIT(0)
#define GPIO_PIN_1                     BIT(1)
#define GPIO_PIN_2                     BIT(2)
#define GPIO_PIN_3                     BIT(3)
#define GPIO_PIN_4                     BIT(4)
#define GPIO_PIN_5                     BIT(5)
#define GPIO_PIN_6                     BIT(6)
#define GPIO_PIN_7                     BIT(7)
#define GPIO_PIN_8                     BIT(8)
#define GPIO_PIN_9                     BIT(9)
#define GPIO_PIN_10                    BIT(10)
#define GPIO_PIN_11                    BIT(11)
#define GPIO_PIN_12                    BIT(12)
#define GPIO_PIN_13                    BIT(13)
#define GPIO_PIN_14                    BIT(14)
#define GPIO_PIN_15                    BIT(15)
#define GPIO_PIN_ALL                   BITS(0,15)

#define GPIO_AFMUX_SET(n, mode)           ((uint32_t)((uint32_t)(mode) << (4U * (n))))
#define GPIO_AFMUX_MASK(n)                (0xFU << (4U * (n)))




#define GPIO_AFMUX_UARTX 0
#define GPIO_AFMUX_JTAG  0
#define GPIO_AFMUX_EVENT 0
#define GPIO_AFMUX_RTC   0
#define GPIO_AFMUX_UART0 1
#define GPIO_AFMUX_UART1 1
#define GPIO_AFMUX_I2C0  2
#define GPIO_AFMUX_I2C1  2
#define GPIO_AFMUX_SPIH0 3
#define GPIO_AFMUX_SPIH1 3
#define GPIO_AFMUX_SPID0 3
#define GPIO_AFMUX_SPID1 3
#define GPIO_AFMUX_PWM0  4
#define GPIO_AFMUX_PWM1  4

#define UARTX_RXD_GPIO0_00    GPIO0,0,GPIO_AFMUX_UARTX
#define UARTX_TXD_GPIO0_01    GPIO0,1,GPIO_AFMUX_UARTX
#define UARTX_RXD_GPIO0_08    GPIO0,8,GPIO_AFMUX_UARTX
#define UARTX_TXD_GPIO0_09    GPIO0,9,GPIO_AFMUX_UARTX

#define JTAG_TCK_GPIO0_02     GPIO0,2,GPIO_AFMUX_JTAG
#define JTAG_TMS_GPIO0_03     GPIO0,3,GPIO_AFMUX_JTAG
#define JTAG_TRSTN_GPIO0_04   GPIO0,4,GPIO_AFMUX_JTAG
#define JTAG_TDI_GPIO0_05     GPIO0,5,GPIO_AFMUX_JTAG
#define JTAG_TDO_GPIO0_06     GPIO0,6,GPIO_AFMUX_JTAG


#define EVENT_MCO_GPIO0_07    GPIO0,7,GPIO_AFMUX_EVENT


#define UART0_RXD_GPIO0_00    GPIO0,0,GPIO_AFMUX_UART0
#define UART0_TXD_GPIO0_01    GPIO0,1,GPIO_AFMUX_UART0
#define UART0_RXD_GPIO0_04    GPIO0,4,GPIO_AFMUX_UART0
#define UART0_TXD_GPIO0_05    GPIO0,5,GPIO_AFMUX_UART0
#define UART0_RXD_GPIO0_08    GPIO0,8,GPIO_AFMUX_UART0
#define UART0_TXD_GPIO0_09    GPIO0,9,GPIO_AFMUX_UART0
#define UART0_RXD_GPIO0_12    GPIO0,4,GPIO_AFMUX_UART0
#define UART0_TXD_GPIO0_13    GPIO0,13,GPIO_AFMUX_UART0

#define UART1_RXD_GPIO1_00    GPIO1,0,GPIO_AFMUX_UART1
#define UART1_TXD_GPIO1_01    GPIO1,1,GPIO_AFMUX_UART1
#define UART1_RXD_GPIO1_04    GPIO1,4,GPIO_AFMUX_UART1
#define UART1_TXD_GPIO1_05    GPIO1,5,GPIO_AFMUX_UART1
#define UART1_RXD_GPIO1_08    GPIO1,8,GPIO_AFMUX_UART1
#define UART1_TXD_GPIO1_09    GPIO1,9,GPIO_AFMUX_UART1
#define UART1_RXD_GPIO1_12    GPIO1,4,GPIO_AFMUX_UART1
#define UART1_TXD_GPIO1_13    GPIO1,13,GPIO_AFMUX_UART1

#define I2C0_SCL_GPIO2_02     GPIO2,2,GPIO_AFMUX_I2C0
#define I2C0_SDA_GPIO2_03     GPIO2,3,GPIO_AFMUX_I2C0
#define I2C0_SCL_GPIO2_06     GPIO2,6,GPIO_AFMUX_I2C0
#define I2C0_SDA_GPIO2_07     GPIO2,7,GPIO_AFMUX_I2C0
#define I2C0_SCL_GPIO2_10     GPIO2,10,GPIO_AFMUX_I2C0
#define I2C0_SDA_GPIO2_11     GPIO2,11,GPIO_AFMUX_I2C0
#define I2C0_SCL_GPIO2_14     GPIO2,14,GPIO_AFMUX_I2C0
#define I2C0_SDA_GPIO2_15     GPIO2,15,GPIO_AFMUX_I2C0

#define I2C1_SCL_GPIO3_02     GPIO3,2,GPIO_AFMUX_I2C1
#define I2C1_SDA_GPIO3_03     GPIO3,3,GPIO_AFMUX_I2C1
#define I2C1_SCL_GPIO3_06     GPIO3,6,GPIO_AFMUX_I2C1
#define I2C1_SDA_GPIO3_07     GPIO3,7,GPIO_AFMUX_I2C1
#define I2C1_SCL_GPIO3_10     GPIO3,10,GPIO_AFMUX_I2C1
#define I2C1_SDA_GPIO3_11     GPIO3,11,GPIO_AFMUX_I2C1
#define I2C1_SCL_GPIO3_14     GPIO3,14,GPIO_AFMUX_I2C1
#define I2C1_SDA_GPIO3_15     GPIO3,15,GPIO_AFMUX_I2C1

#define SPIH0_CSB_GPIO0_02    GPIO0,2,GPIO_AFMUX_SPIH0
#define SPIH0_SCK_GPIO0_03    GPIO0,3,GPIO_AFMUX_SPIH0
#define SPIH0_MISO_GPIO0_04   GPIO0,4,GPIO_AFMUX_SPIH0
#define SPIH0_MOSI_GPIO0_05   GPIO0,5,GPIO_AFMUX_SPIH0
#define SPIH0_WPN_GPIO0_06    GPIO0,6,GPIO_AFMUX_SPIH0
#define SPIH0_HOLDN_GPIO0_07  GPIO0,7,GPIO_AFMUX_SPIH0
#define SPIH0_CSB_GPIO0_10    GPIO0,10,GPIO_AFMUX_SPIH0
#define SPIH0_SCK_GPIO0_11    GPIO0,11,GPIO_AFMUX_SPIH0
#define SPIH0_MISO_GPIO0_12   GPIO0,12,GPIO_AFMUX_SPIH0
#define SPIH0_MOSI_GPIO0_13   GPIO0,13,GPIO_AFMUX_SPIH0
#define SPIH0_WPN_GPIO0_14    GPIO0,14,GPIO_AFMUX_SPIH0
#define SPIH0_HOLDN_GPIO0_15  GPIO0,15,GPIO_AFMUX_SPIH0

#define SPIH1_CSB_GPIO1_02    GPIO1,2,GPIO_AFMUX_SPIH1
#define SPIH1_SCK_GPIO1_03    GPIO1,3,GPIO_AFMUX_SPIH1
#define SPIH1_MISO_GPIO1_04   GPIO1,4,GPIO_AFMUX_SPIH1
#define SPIH1_MOSI_GPIO1_05   GPIO1,5,GPIO_AFMUX_SPIH1
#define SPIH1_WPN_GPIO1_06    GPIO1,6,GPIO_AFMUX_SPIH1
#define SPIH1_HOLDN_GPIO1_07  GPIO1,7,GPIO_AFMUX_SPIH1
#define SPIH1_CSB_GPIO1_10    GPIO1,10,GPIO_AFMUX_SPIH1
#define SPIH1_SCK_GPIO1_11    GPIO1,11,GPIO_AFMUX_SPIH1
#define SPIH1_MISO_GPIO1_12   GPIO1,12,GPIO_AFMUX_SPIH1
#define SPIH1_MOSI_GPIO1_13   GPIO1,13,GPIO_AFMUX_SPIH1
#define SPIH1_WPN_GPIO1_14    GPIO1,14,GPIO_AFMUX_SPIH1
#define SPIH1_HOLDN_GPIO1_15  GPIO1,15,GPIO_AFMUX_SPIH1

#define SPID0_TPMCSB_GPIO2_01 GPIO2,1,GPIO_AFMUX_SPID0
#define SPID0_CSB_GPIO2_02    GPIO2,2,GPIO_AFMUX_SPID0
#define SPID0_SCK_GPIO2_03    GPIO2,3,GPIO_AFMUX_SPID0
#define SPID0_MISO_GPIO2_04   GPIO2,4,GPIO_AFMUX_SPID0
#define SPID0_MOSI_GPIO2_05   GPIO2,5,GPIO_AFMUX_SPID0
#define SPID0_WPN_GPIO2_06    GPIO2,6,GPIO_AFMUX_SPID0
#define SPID0_HOLDN_GPIO2_07  GPIO2,7,GPIO_AFMUX_SPID0
#define SPID0_CSB_GPIO2_10    GPIO2,10,GPIO_AFMUX_SPID0
#define SPID0_SCK_GPIO2_11    GPIO2,11,GPIO_AFMUX_SPID0
#define SPID0_MISO_GPIO2_12   GPIO2,12,GPIO_AFMUX_SPID0
#define SPID0_MOSI_GPIO2_13   GPIO2,13,GPIO_AFMUX_SPID0
#define SPID0_WPN_GPIO2_14    GPIO2,14,GPIO_AFMUX_SPID0
#define SPID0_HOLDN_GPIO2_15  GPIO2,15,GPIO_AFMUX_SPID0

#define SPID1_TPMCSB_GPIO3_01 GPIO3,1,GPIO_AFMUX_SPID1
#define SPID1_CSB_GPIO3_02    GPIO3,2,GPIO_AFMUX_SPID1
#define SPID1_SCK_GPIO3_03    GPIO3,3,GPIO_AFMUX_SPID1
#define SPID1_MISO_GPIO3_04   GPIO3,4,GPIO_AFMUX_SPID1
#define SPID1_MOSI_GPIO3_05   GPIO3,5,GPIO_AFMUX_SPID1
#define SPID1_WPN_GPIO3_06    GPIO3,6,GPIO_AFMUX_SPID1
#define SPID1_HOLDN_GPIO3_07  GPIO3,7,GPIO_AFMUX_SPID1
#define SPID1_CSB_GPIO3_10    GPIO3,10,GPIO_AFMUX_SPID1
#define SPID1_SCK_GPIO3_11    GPIO3,11,GPIO_AFMUX_SPID1
#define SPID1_MISO_GPIO3_12   GPIO3,12,GPIO_AFMUX_SPID1
#define SPID1_MOSI_GPIO3_13   GPIO3,13,GPIO_AFMUX_SPID1
#define SPID1_WPN_GPIO3_14    GPIO3,14,GPIO_AFMUX_SPID1
#define SPID1_HOLDN_GPIO3_15  GPIO3,15,GPIO_AFMUX_SPID1

#define PWM0_CH0_GPIO0_00     GPIO0,0,GPIO_AFMUX_PWM0
#define PWM0_CH1_GPIO0_01     GPIO0,1,GPIO_AFMUX_PWM0
#define PWM0_CH2_GPIO0_02     GPIO0,2,GPIO_AFMUX_PWM0
#define PWM0_CH3_GPIO0_03     GPIO0,3,GPIO_AFMUX_PWM0
#define PWM0_CH4_GPIO0_04     GPIO0,4,GPIO_AFMUX_PWM0
#define PWM0_CH5_GPIO0_05     GPIO0,5,GPIO_AFMUX_PWM0
#define PWM0_CH0_GPIO0_08     GPIO0,8,GPIO_AFMUX_PWM0
#define PWM0_CH1_GPIO0_09     GPIO0,9,GPIO_AFMUX_PWM0
#define PWM0_CH2_GPIO0_10     GPIO0,10,GPIO_AFMUX_PWM0
#define PWM0_CH3_GPIO0_11     GPIO0,11,GPIO_AFMUX_PWM0
#define PWM0_CH4_GPIO0_12     GPIO0,12,GPIO_AFMUX_PWM0
#define PWM0_CH5_GPIO0_13     GPIO0,13,GPIO_AFMUX_PWM0

#define PWM1_CH0_GPIO1_00     GPIO1,0,GPIO_AFMUX_PWM1
#define PWM1_CH1_GPIO1_01     GPIO1,1,GPIO_AFMUX_PWM1
#define PWM1_CH2_GPIO1_02     GPIO1,2,GPIO_AFMUX_PWM1
#define PWM1_CH3_GPIO1_03     GPIO1,3,GPIO_AFMUX_PWM1
#define PWM1_CH4_GPIO1_04     GPIO1,4,GPIO_AFMUX_PWM1
#define PWM1_CH5_GPIO1_05     GPIO1,5,GPIO_AFMUX_PWM1
#define PWM1_CH0_GPIO1_08     GPIO1,8,GPIO_AFMUX_PWM1
#define PWM1_CH1_GPIO1_09     GPIO1,9,GPIO_AFMUX_PWM1
#define PWM1_CH2_GPIO1_10     GPIO1,10,GPIO_AFMUX_PWM1
#define PWM1_CH3_GPIO1_11     GPIO1,11,GPIO_AFMUX_PWM1
#define PWM1_CH4_GPIO1_12     GPIO1,12,GPIO_AFMUX_PWM1
#define PWM1_CH5_GPIO1_13     GPIO1,13,GPIO_AFMUX_PWM1

/* function declarations */
/* reset GPIO port */
void gpio_deinit(uint32_t gpio_periph);
/* GPIO parameter initialization */
void gpio_init(uint32_t gpio_periph);

void gpio_out_enable(uint32_t gpio_periph, uint32_t pin);
void gpio_out_disable(uint32_t gpio_periph, uint32_t pin);
/* set GPIO pin bit */
void gpio_bit_set(uint32_t gpio_periph, uint32_t pin);
/* reset GPIO pin bit */
void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin);
/* write data to the specified GPIO pin */
void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, uint32_t bit_value);
/* write data to the specified GPIO port */
void gpio_port_write(uint32_t gpio_periph, uint16_t data);

/* get GPIO pin input status */
FlagStatus gpio_input_bit_get(uint32_t gpio_periph, uint32_t pin);
/* get GPIO port input status */
uint16_t gpio_input_port_get(uint32_t gpio_periph);
/* get GPIO pin output status */
FlagStatus gpio_output_bit_get(uint32_t gpio_periph, uint32_t pin);
/* get GPIO port output status */
uint16_t gpio_output_port_get(uint32_t gpio_periph);

/* configure GPIO pin remap */
void gpio_pin_af_set(uint32_t gpio_periph, uint32_t pidx, uint32_t afmux);
void gpio_pin_af_reset(uint32_t gpio_periph, uint32_t pidx);


LINK32FA016BX_END_DECLS

#endif /* GD32VF103_GPIO_H */
